import { ElMessage } from "element-plus";
import { tokenManager } from "./token";
import { userManager } from "./user";

export var myRequest={
    request: function(param) {
        let requestUrl = this.getServerURL(param.url);
        const self = this;
        const token = tokenManager.getToken();
        const headers = {
            'Content-Type': 'application/json',
        };
        if (token) {
            // 此处修改：除了Authorization头部，也添加一个名为'token'的头部
            headers['Authorization'] = `Bearer ${token}`; // 标准的Bearer token
            headers['token'] = token; // 后端 AuditorsController 期望的 'token' 头部 
        } else {
            console.warn('No token found in localStorage');
        }

        const fetchOptions = {
            method: param.method,
            headers: headers,
        };
        if (param.method !== 'GET' && param.data) {
            fetchOptions.body = JSON.stringify(param.data);
        }
        fetch(requestUrl, fetchOptions)
            .then(response => {
                if (!response.ok) {
                   
                    if (String(response.status) === '401') {
                       
                        return Promise.reject(new Error('未登录'));
                    }
                    return response.json().then(err => Promise.reject(err));
                }
                return response.json();
            })
            .then(result => {
                
                if (result.code === 401) {
                    userManager.toLogin()
                    //ElMessage.error('登录过期，请重新登录')
                    return
                }
                
                if (param.success) {
                    param.success(result);
                }
            })
            .catch(err => {
                console.error('API Error:', err);
                if (param.error) {
                    param.error(err);
                } else {
                    self.errorTips(err.message || '请求失败');
                }
            });
    },
    formRequest: async function(param) {
    try {
      let requestUrl = this.getServerURL(param.url);
      const token = tokenManager.getToken();
      const headers = {};
      if (token) {
        // 此处修改：除了Authorization头部，也添加一个名为'token'的头部
        headers['Authorization'] = `Bearer ${token}`; // 标准的Bearer token
        headers['token'] = token; // 后端 AuditorsController 期望的 'token' 头部 
      }

      const fetchOptions = {
        method: param.method,
        headers: headers,
        body: param.data instanceof FormData ? param.data : new FormData()
      };

      const response = await fetch(requestUrl, fetchOptions);
      if (!response.ok) {
        if (response.status === 401) {
          this.toLogin();
          throw new Error('未授权');
        }
        // 尝试解析错误响应，如果是非JSON格式，则使用默认消息
        let errorData;
        try {
            errorData = await response.json();
        } catch (e) {
            errorData = { message: `请求失败，状态码: ${response.status}` };
        }
        throw new Error(errorData.message || `请求失败，状态码: ${response.status}`);
      }

      const result = await response.json();
      console.log('API Response:', result);
      if (param.success) {
        param.success(result);
      }
      return result; // formRequest 应该返回结果以便 await 链式调用
    } catch (err) {
      console.error('API Error:', err);
      if (param.error) {
        param.error(err);
      } else {
        this.errorTips(err.message || '请求失败');
      }
      throw err; // 抛出错误以便调用方捕获
    }
    },
    getServerURL: function(path) {
        const baseURL = 'http://127.0.0.1:8080/'; // 根据实际 API 地址修改
        //const baseURL='http://139.224.239.211:3000/api/'
        return `${baseURL}${path}`;
    },
    // 添加一个简单的错误提示方法，实际项目中可以使用 UI 库的 Toast/Message
    errorTips: function(message) {
        alert('错误: ' + message);
    },

    // 在 request.js 中
    streamRequest: async function(param) {
        try {
            let requestUrl = this.getServerURL(param.url);
            const token = tokenManager.getToken();
            const headers = {
                'Content-Type': 'application/json',
            };
            if (token) {
                headers['token'] = token;
            }

            const response = await fetch(requestUrl, {
                method: 'POST',
                headers: headers,
                body: JSON.stringify(param.data)
            });

            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
            const reader = response.body.getReader();
            const decoder = new TextDecoder("utf-8");

            while (true) {
                const {
                    done,
                    value
                } = await reader.read();
                if (done) {
                    if (param.onDone) param.onDone();
                    break;
                }
                const chunk = decoder.decode(value);
                const lines = chunk.split('\n');

                for (const line of lines) {
                    if (line.startsWith('data:')) {
                        const payload = line.substring(5).trim();

                        // 检查结束信号
                        if (payload === '[DONE]') {
                            if (param.onDone) param.onDone();
                            // 注意：这里需要一个方式来跳出外层while循环，一个简单的方法是直接返回
                            return;
                        }

                        // 【核心修改】解析从后端发来的 JSON 数据
                        if (payload) {
                            try {
                                const parsedData = JSON.parse(payload);
                                if (param.onMessage && typeof parsedData.content !== 'undefined') {
                                    param.onMessage(parsedData.content);
                                }
                            } catch (e) {
                                // 忽略无法解析的行，可能为空行
                            }
                        }
                    }
                }
            }
        } catch (error) {
            console.error('Streaming Request Error:', error);
            if (param.onError) param.onError(error);
        }
    },
}
